package com.ismt.servletP3;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import javax.jdo.PersistenceManager;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.output.ByteArrayOutputStream;

import com.google.appengine.api.datastore.Blob;
import com.google.appengine.api.datastore.Key;

@PersistenceCapable
public class Galeria {

	@PrimaryKey
	@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
	Key id_galeria;

	@Persistent
	String nome_galeria;
	
	@Persistent
	String email_utilizador;
	
	public Key getId_galeria() {
		return id_galeria;
	}

	public void setId_galeria(Key id_galeria) {
		this.id_galeria = id_galeria;
	}

	public String getNome_galeria() {
		return nome_galeria;
	}

	public void setNome_galeria(String nome_galeria) {
		this.nome_galeria = nome_galeria;
	}

	public String getEmail_utilizador() {
		return email_utilizador;
	}

	public void setEmail_utilizador(String email_utilizador) {
		this.email_utilizador = email_utilizador;
	}
	
	public static String criar(Utilizador utilizadorAutenticado, String nome_galeria) {
		PersistenceManager pm = null;
		
		if(nome_galeria == null) {
			return "-1";
		} else {
			try {
				pm = PMF.get().getPersistenceManager();
				
				String query = "SELECT from " + Galeria.class.getName()
		 			+ " where nome_galeria == '" + nome_galeria + "'"
		 			+ " & email_utilizador == '" + utilizadorAutenticado.email_utilizador + "'";
		 
				@SuppressWarnings("unchecked")
				List<Galeria> listaGalerias = (List<Galeria>) pm.newQuery(query).execute();
			 
				if(listaGalerias.size() > 0) {
					return "-3";
				} else {
					Galeria criar = new Galeria();
					
					criar.nome_galeria = nome_galeria;
					criar.email_utilizador = utilizadorAutenticado.email_utilizador;
					
					pm.makePersistent(criar);
				}	
			} catch(Exception e) {
				System.out.println(e.getMessage());
				return "-2";
			} finally {
			    pm.close();
			}
			return "1";
		}
	}
	
	public static String eliminar(Utilizador utilizadorAutenticado, String nome_galeria) {
		PersistenceManager pm = null;
		
		if(nome_galeria == null) {
			return "-1";
		} else {
			try {
				pm = PMF.get().getPersistenceManager();
				
				String query2 = "SELECT from " + Imagem.class.getName()
					+ " where nome_galeria == '" + nome_galeria + "'"
					+ " & email_utilizador == '" + utilizadorAutenticado.email_utilizador + "'";
				
				@SuppressWarnings("unchecked")
				List<Imagem> listaImagens = (List<Imagem>) pm.newQuery(query2).execute();
				
				if(listaImagens.size() > 0) {
					for(int i = 0; i < listaImagens.size(); i++) {
						pm.deletePersistent(listaImagens.get(i));
					}
				}
				
				String query = "SELECT from " + Galeria.class.getName()
		 			+ " where nome_galeria == '" + nome_galeria + "'"
		 			+ " & email_utilizador == '" + utilizadorAutenticado.email_utilizador + "'";
		 
				@SuppressWarnings("unchecked")
				List<Galeria> listaGalerias = (List<Galeria>) pm.newQuery(query).execute();
			 
				if(listaGalerias.size() > 1 || listaGalerias.size() <= 0) {
					return "-3";
				} else {
					pm.deletePersistent(listaGalerias.get(0));
				}	
			} catch(Exception e) {
				System.out.println(e.getMessage());
				return "-2";
			} finally {
			    pm.close();
			}
			return "1";
		}
	}
		
	public static String uploadImagemGaleria(HttpServletRequest request, Utilizador utilizadorAutenticado, String nome_galeria) {
		
		PersistenceManager pm = null;
		
		if(utilizadorAutenticado != null) {
			try {
				pm = PMF.get().getPersistenceManager();
				
				ServletFileUpload upload 	= new ServletFileUpload();
				FileItemIterator iterator	= upload.getItemIterator(request);
				
				while(iterator.hasNext()) {		
					FileItemStream item	 		= iterator.next();
					InputStream stream	 		= item.openStream();
					
					if(item.isFormField()) {
				
					} else {
						int len;
				        byte[] buffer = new byte[8192];
				        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
				        while ((len = stream.read(buffer, 0, buffer.length)) != -1) 
				            outputStream.write(buffer, 0, len);
				        
						String query = "SELECT from " + Galeria.class.getName()
			 				+ " where nome_galeria == '" + nome_galeria + "'"
			 				+ " & email_utilizador == '" + utilizadorAutenticado.email_utilizador + "'";
			 
						@SuppressWarnings("unchecked")
						List<Galeria> listaGalerias = (List<Galeria>) pm.newQuery(query).execute();
				        
				        Blob fotoGaleria = new com.google.appengine.api.datastore.Blob(outputStream.toByteArray());
				        
						if (listaGalerias.size() > 0) {
							Imagem imagemGaleria = new Imagem();
							
							imagemGaleria.nome_imagem  		= item.getName();
							imagemGaleria.bytes_imagem 		= fotoGaleria;
							imagemGaleria.email_utilizador 	= utilizadorAutenticado.email_utilizador;
							imagemGaleria.nome_galeria		= nome_galeria;
							
							pm.makePersistent(imagemGaleria);
						} else {
							return "-2";
						}
					    outputStream.close();
					   	outputStream = null;
					}
				}
			} catch(Exception e) {
				System.out.println(e.getMessage());
				return "-2";
			} finally {
			    pm.close();
			}
			return "1";
		} else {
			return "-1";
		}
	}
	
	public static void mostrarImagemGaleria(HttpServletResponse response, Utilizador utilizadorAutenticado, String nome_galeria, String nome_imagem) {
		PersistenceManager pm = null;
		Imagem imagemPerfil = null;
		
		try {
			pm = PMF.get().getPersistenceManager();
			
			response.setContentType("image/jpeg");
			
			String query = "SELECT from " + Imagem.class.getName()
				+ " where nome_galeria == '" + nome_galeria + "'"
				+ " & nome_imagem == '" + nome_imagem + "'"
				+ " & email_utilizador == '" + utilizadorAutenticado.email_utilizador + "'";
		
			@SuppressWarnings("unchecked")
			List<Imagem> listaImagens = (List<Imagem>) pm.newQuery(query).execute();
	 
			if(listaImagens.size() > 0) {
				imagemPerfil = listaImagens.get(0);
				
				response.getOutputStream().write(imagemPerfil.bytes_imagem.getBytes());
			}
			else {
				response.sendRedirect("/noImage.jpg");
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			pm.close();
		}
	}
	
}